#ifndef __LINKLIST_H_
#define __LINKLIST_H_

#include <iostream>

template <typename T>
class LinkList
{
private:
    struct Node // 链表结点
    {
        T data;
        struct Node *next;
    };
    struct Node *head; // 头指针
    int size;          // 链表已有数据大小

public:
    LinkList();                               // 创建一个头结点,方便后续操作
    ~LinkList();                              // 析构函数,释放内存
    void operator=(const LinkList<T> &other); // 拷贝构造函数

    int Size() const;                      // 获取链表大小
    bool Empty() const;                    // 判断链表是否为空
    Node &Front();                         // 获取链表头结点
    Node &Back();                          // 获取链表尾结点
    void PushFront(const T &data);         // 向链表头部插入数据
    void PushBack(const T &data);          // 向链表尾部插入数据
    void PopFront();                       // 删除链表头结点
    void PopBack();                        // 删除链表尾结点
    void Insert(int index, const T &data); // 在指定位置插入数据
    void Erase(int index);                 // 删除指定位置的数据
    T &operator[](int index);              // 重载[]操作符,获取指定位置的数据
    const T &operator[](int index) const;  // 重载[]操作符,获取指定位置的数据
    /*
    private:
        void CopyFrom(const LinkList<T>& other); // 拷贝链表数据
        void Clear(); // 清空链表数据
        void Print() const; // 打印链表数据
    */
};
#endif